/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Servlets;

import Clases.*;
import Persistencia.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 *
 * @author Jesus
 */
public class SAlta extends HttpServlet {
   
    /** 
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException, ParseException, SQLException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();

        String clase = request.getParameter("id"); 
        
        if(clase.equals("Cliente")){
            // RECOJIDA DE DATOS DEL CLIENTE
             String nombre = request.getParameter("nombre");
             String direccion = request.getParameter("direccion");
             String provincia = request.getParameter("provincia");
             String localidad = request.getParameter("localidad");
             String codigoPostal = request.getParameter("cp");
             String movil = request.getParameter("movil");
             String email = request.getParameter("email");
             String nif = request.getParameter("nif");
             String telefono1 = request.getParameter("telf1");
             String telefono2 = request.getParameter("telf2");
             String fax = request.getParameter("fax");
             String personaContacto = request.getParameter("contacto");
             String observacion = request.getParameter("observacion");

             int addcliente = 0;
             if(nombre.equals("") || direccion.equals("") || provincia.equals("") || localidad.equals("")
                     || codigoPostal.equals("") || movil.equals("") || nif.equals("")){
                addcliente = 2;
             }else{

                 // INSERCION DE CLIENTE EN BD
                Cliente cliente = new Cliente(nombre, nif, email, personaContacto, movil, telefono1, telefono2,
                        fax, direccion, provincia, localidad, codigoPostal, observacion);
                addcliente = PersistenciaCliente.insertarCliente(cliente);
             }
           
             // REDIRECCION 
             request.setAttribute("insertado",addcliente);
             RequestDispatcher rd = request.getRequestDispatcher("addcliente.jsp");
             rd.forward(request, response);
         
        }else if(clase.equals("DatosFacturacion")) {
            // RECOJIDA DE DATOS DEL CLIENTE
             String codigo = request.getParameter("codigo");
             String nombre = request.getParameter("nombre");
             String direccion = request.getParameter("direccion");
             String provincia = request.getParameter("provincia");
             String localidad = request.getParameter("localidad");
             String codigoPostal = request.getParameter("cp");
             String movil = request.getParameter("movil");
             String email = request.getParameter("email");
             String nif = request.getParameter("nif");
             String telefono1 = request.getParameter("telf1");
             String telefono2 = request.getParameter("telf2");
             String fax = request.getParameter("fax");
             String personaContacto = request.getParameter("contacto");
             String observacion = request.getParameter("observacion");

             int addfaccliente = 0;
             if(nombre.equals("") || direccion.equals("") || provincia.equals("") || localidad.equals("")
                     || codigoPostal.equals("") || movil.equals("") || nif.equals("")){
                addfaccliente = 2;
             }else{

                 // INSERCION DE CLIENTE EN BD
                FacturacionCliente FacCliente = new FacturacionCliente(PersistenciaCliente.obtenerCliente(codigo), nombre, nif, email, personaContacto, movil, telefono1, telefono2,
                        fax, direccion, provincia, localidad, codigoPostal, observacion);
                addfaccliente = PersistenciaFacturacionCliente.insertarFacturacionCliente(FacCliente);
             }

             // REDIRECCION
             request.setAttribute("insertado",addfaccliente);
             RequestDispatcher rd = request.getRequestDispatcher("addDatosFacturacion.jsp?codigo="+ codigo +"&nombre="+ nombre);
             rd.forward(request, response);
             
        }else if(clase.equals("Factura")){
            
            Factura factura = null;
            int addfactura = 0;
            DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
            ArrayList<LineaServicioFactura> lineas = new ArrayList();          
            int addlinea=0; 
            String codFactura = null;            
            
            String cif = request.getParameter("cif");
            String tipoIVA = request.getParameter("tipoiva");
            String cliente = request.getParameter("cliente");
            String serie = request.getParameter("serie");
            String codCliente = request.getParameter("cliente");
            String fechaS = request.getParameter("fecha");
            String retencionS = request.getParameter("retencion"); 
            Date fecha;
             if(fechaS.equals("") || retencionS.equals("") || serie.equals("Seleccione Serie") || cliente.equals("Seleccione cliente") || tipoIVA.equals("Seleccione Tipo IVA") || cif.equals("Seleccione CIF")) {
                addfactura = 2;
             }else{

                fecha = df.parse(fechaS);
                float retencion = (Float.parseFloat(request.getParameter("retencion")))/100;
                String tipoIva = request.getParameter("tipoiva"); 
                FacturacionCliente fc = PersistenciaFacturacionCliente.obtenerFacturacionCliente(codCliente, cif);
                Cliente cli = PersistenciaCliente.obtenerCliente(codCliente);
                TiposIva iva = PersistenciaTiposIva.obtenterTipoIva(tipoIva);            
                SFacturacion sf = PersistenciaSFacturacion.obtenerSFacturacion(serie);
                factura = new Factura(sf, fc, fecha, iva, retencion, lineas);
                codFactura = factura.getCodigo();               
                addfactura = PersistenciaFactura.insertarFactura(factura);
             }           
             request.setAttribute("codFactura", codFactura);
             request.setAttribute("insertadoF",addfactura);  
             RequestDispatcher rd = request.getRequestDispatcher("addLineaFactura.jsp");             
             rd.forward(request, response);            
            
            
        }else if(clase.equals("Linea")){
             int addlinea=0; 
             String codFactura = null;            
             String servicioS = request.getParameter("servicio");
             String cantidad = request.getParameter("cantidad");
             String precio = request.getParameter("precio");
             if(cantidad.equals("") || precio.equals("") || servicioS.equals("Seleccione un Servicio") ){
                addlinea = 2;
             }else{ 
                 
                 //creamos la línea que requiere en su constructor un objeto Servicio
                 float c = Float.parseFloat(request.getParameter("cantidad"));
                 float p = Float.parseFloat(request.getParameter("precio"));
                 String servicio = request.getParameter("servicio");                 
                 Servicio servicio1 = PersistenciaServicio.obtenerServicio(servicio);
                 LineaServicioFactura lsf = new LineaServicioFactura(servicio1,c,p);
                 
                 //insertamos la línea que requiere del objeto factura actual
                 codFactura = request.getParameter("codFactura");
                 Factura f2 = PersistenciaFactura.obtenerFactura(codFactura);
                 addlinea = PersistenciaLineaFactura.insertarLineaServicioFactura(lsf, f2);   
             }
                 request.setAttribute("insertadoL",addlinea);        
                 request.setAttribute("codFactura", codFactura);               
                 RequestDispatcher rd = request.getRequestDispatcher("addLineaFactura.jsp");
                 rd.forward(request, response); 
                 
        }else if(clase.equals("Terminar")){
            
                 String codFactura = request.getParameter("codFactura");
                 ArrayList<LineaServicioFactura> lineas = PersistenciaLineaFactura.obtenerLineas(codFactura);
                 Factura f = PersistenciaFactura.obtenerFactura(codFactura);
                 FacturacionCliente fc = PersistenciaFacturacionCliente.obtenerFacturacionCliente(f.getFacturacionCliente().getCliente().getCodigoCliente(),f.getFacturacionCliente().getNif());                 
                 Factura f2 = new Factura(f.getFacturacionCliente(), f.getSerieFacturacion(), codFactura, f.getFecha(), f.getTipoIva(), f.getRetencion(), f.getLineas(), f.isEnviado());
                 int addfactura = PersistenciaFactura.modificarFactura(f2);
                 request.setAttribute("facturaguardada", addfactura);
                 RequestDispatcher rd = request.getRequestDispatcher("addFactura.jsp");
                 rd.forward(request, response);                  
            
        }else if(clase.equals("LineaNueva"))
        {
             int addlineaN=0;
             String codFactura=null;
             Factura factura = (Factura)request.getAttribute("facturaL");
             request.setAttribute("factura", factura);
             String servicioS = request.getParameter("servicio");
             String cantidad = request.getParameter("cantidad");
             String precio = request.getParameter("precio");
             if(cantidad.equals("") || precio.equals("") || servicioS.equals("Seleccione un Servicio") ){
                addlineaN = 2;
             }else{ 
                 
                 //creamos la línea que requiere en su constructor un objeto Servicio
                 float c = Float.parseFloat(request.getParameter("cantidad"));
                 float p = Float.parseFloat(request.getParameter("precio"));
                 String servicio = request.getParameter("servicio");                 
                 Servicio servicio1 = PersistenciaServicio.obtenerServicio(servicio);
                 LineaServicioFactura lsf = new LineaServicioFactura(servicio1,c,p);
                 
                 //insertamos la línea que requiere del objeto factura actual
                 codFactura = request.getParameter("codigofactura");
                 Factura f2 = PersistenciaFactura.obtenerFactura(codFactura);
                 addlineaN = PersistenciaLineaFactura.insertarLineaServicioFactura(lsf, f2);               
             }
                 request.setAttribute("insertadoL",addlineaN);        
                 request.setAttribute("codigofactura", codFactura);               
                 RequestDispatcher rd = request.getRequestDispatcher("addNuevaLinea.jsp");
                 rd.forward(request, response);              
        
        }else if(clase.equals("TerminarNueva")) 
        {
                 Factura factura = (Factura)request.getAttribute("facturaL");
                 request.setAttribute("factura", factura);
                 String codFactura = request.getParameter("codigofactura");
                 ArrayList<LineaServicioFactura> lineas = PersistenciaLineaFactura.obtenerLineas(codFactura);
                 Factura f = PersistenciaFactura.obtenerFactura(codFactura);
                 //Factura f2 = new Factura(f.getFacturacionCliente().getCliente(), f.getSerieFacturacion(), codFactura, f.getFecha(), f.getTipoIva(), f.getRetencion(), f.getLineas(), f.isEnviado());
                 //int addfactura = PersistenciaFactura.modificarFactura(f2);
                 //Factura f3 = PersistenciaFactura.obtenerFactura(f2.getCodigo());
                 //request.setAttribute("factura", f3);
                 request.setAttribute("lineanueva", 1);
                 RequestDispatcher rd = request.getRequestDispatcher("editaFactura.jsp");
                 rd.forward(request, response);     
            
        }else if(clase.equals("Serie")){
            
             // RECOJIDA DE DATOS DE LA SERIE DE FACTURACION
             String seriefac = request.getParameter("seriefac");
             String codigo = request.getParameter("codigo");
             String descripcion = request.getParameter("descripcion");
             int addserie = 0;

             // COMPROBACION E INSERCION DE LA SERIE DE FACTURACION
             if(seriefac.equals("") || codigo.equals("")){
                 addserie = 2;
             }else{
                 SFacturacion seriefacuracion = new SFacturacion(seriefac, codigo, descripcion);
                 addserie = PersistenciaSFacturacion.insertarSFacturacion(seriefacuracion);
             }

             request.setAttribute("insertado",addserie);

             // REDIRECCION
             RequestDispatcher rd = request.getRequestDispatcher("addSFacturacion.jsp");
             rd.forward(request, response);
             
        }else if(clase.equals("Servicio")){
             
            // RECOJIDA DE DATOS DEL SERVICIO
             String Nservicio = request.getParameter("servicio");
             String descripcion = request.getParameter("descripcion");

             int addserv = 0;

             // COMPROBACION E INSERCION DEL USUARIO
             if(Nservicio.equals("") || descripcion.equals("")){
                addserv = 2;
             }else{
                Servicio servicio = new Servicio(Nservicio, descripcion);
                addserv = PersistenciaServicio.insertarServicio(servicio);
             }

               // INSERCION DEL ATRIBUTO CLIENTE PARA DESPUES COMPROBAR Y SACAR EL MENSAJE EN ADDUSUARIO.JSP
             request.setAttribute("insertado",addserv);

             // REDIRECCION          
             RequestDispatcher rd = request.getRequestDispatcher("addServicios.jsp");         
             rd.forward(request, response);
             
        }else if(clase.equals("TipoIva")){
            
            // RECOJIDA DE DATOS DEL TIPO DE IVA
            float porcentaje;
            try{
                porcentaje = Float.parseFloat(request.getParameter("porcentaje"));
            }catch(Exception ex){
                porcentaje = 915;
            }
             String descripcion = request.getParameter("descripcion");

             int addiva = 0;

             // COMPROBACION E INSERCION DEL USUARIO
             if(porcentaje>100 && porcentaje!=915){
                addiva = 3;
             }else{
                 if(descripcion.equals("") || porcentaje==915){
                    addiva = 2;
                }else{            
                    TiposIva tipoiva = new TiposIva(descripcion, porcentaje);
                    addiva = PersistenciaTiposIva.insertarTipoIva(tipoiva);
                }
             }

             // INSERCION DEL ATRIBUTO CLIENTE PARA DESPUES COMPROBAR Y SACAR EL MENSAJE EN ADDUSUARIO.JSP
             request.setAttribute("insertado",addiva);

             // REDIRECCION
             RequestDispatcher rd = request.getRequestDispatcher("addTiposIva.jsp");
             rd.forward(request, response);

        }else if(clase.equals("Usuario")){
            
            // RECOJIDA DE DATOS DEL USUARIO
             String Nusuario = request.getParameter("nombreusr");
             String clave = request.getParameter("clave1");
             String clave2 = request.getParameter("clave2");
             int addusr = 0;

             // COMPROBACION E INSERCION DEL USUARIO
             if(Nusuario.equals("") || clave.equals("")){
                 addusr = 3;
             }else{
                 if(clave.equals(clave2)){
                    Usuario usuario = new Usuario(Nusuario, clave, 1); 
                    addusr = PersistenciaUsuario.insertarUsuario(usuario);
                 }else{
                     addusr = 2;
                 }
             }

            // INSERCION DEL ATRIBUTO CLIENTE PARA DESPUES COMPROBAR Y SACAR EL MENSAJE EN ADDUSUARIO.JSP
             request.setAttribute("insertado",addusr);

             // REDIRECCION          
             RequestDispatcher rd = request.getRequestDispatcher("addUsuario.jsp");         
             rd.forward(request, response);
                     
        } else if (clase.equals("clientea")) {
            int altacliente;
            altacliente = 0;
            String codigo = request.getParameter("codigo");

            altacliente = PersistenciaCliente.altaCliente(codigo);
            altacliente = 2;
            request.setAttribute("insertado", altacliente);

            List<Cliente> clientes = PersistenciaCliente.obtenerClientes();
            Cliente cliente = PersistenciaCliente.obtenerCliente(codigo);
            request.setAttribute("clientes", clientes);
            request.setAttribute("cliente", cliente);

            RequestDispatcher rd = request.getRequestDispatcher("verClientes.jsp");
            rd.forward(request, response);
        } else if (clase.equals("usuarioa")){
            int altausuario;
            altausuario = 0;
            String codigo = request.getParameter("codigo");
            
            altausuario = PersistenciaUsuario.altaUsuario(codigo);
            altausuario = 2;
            request.setAttribute("insertado", altausuario);

            List<Usuario> usuarios = PersistenciaUsuario.obtenerUsuarios();
            Usuario usuario = PersistenciaUsuario.obtenerUsuario(codigo);
            request.setAttribute("usuarios", usuarios);
            request.setAttribute("usuario", usuario);

            RequestDispatcher rd = request.getRequestDispatcher("verUsuarios.jsp");
            rd.forward(request, response);
        }
         
        try {
            /* TODO output your page here
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Servlet SAlta</title>");  
            out.println("</head>");
            out.println("<body>");
            out.println("<h1>Servlet SAlta at " + request.getContextPath () + "</h1>");
            out.println("</body>");
            out.println("</html>");
            */
        } finally { 
            out.close();
        }
    } 

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /** 
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        try {
            try {
                processRequest(request, response);
            } catch (SQLException ex) {
                Logger.getLogger(SAlta.class.getName()).log(Level.SEVERE, null, ex);
            }
        } catch (ParseException ex) {
            Logger.getLogger(SAlta.class.getName()).log(Level.SEVERE, null, ex);
        }
    } 

    /** 
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        try {
            try {
                processRequest(request, response);
            } catch (SQLException ex) {
                Logger.getLogger(SAlta.class.getName()).log(Level.SEVERE, null, ex);
            }
        } catch (ParseException ex) {
            Logger.getLogger(SAlta.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /** 
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

}
